package com.admin_system.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;

/**
 * 全局异常处理器
 * 统一处理系统中的各类异常，返回友好的错误信息
 * 使用Spring的@ControllerAdvice机制，可以捕获所有控制器中抛出的异常
 */
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    /** 日志记录器 */
    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * 处理文件上传大小超限异常
     * 当上传的文件超过系统设置的最大大小限制时触发
     * 返回统一格式的错误响应，包含错误码和友好提示
     *
     * @param e 上传超限异常对象
     * @return 包含错误信息的响应实体，状态码413（负载过大）
     */
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public ResponseEntity<Map<String, Object>> handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) {
        // 记录异常日志，便于排查问题
        logger.error("文件上传大小超出限制", e);
        
        // 获取根因，提供详细错误信息
        Throwable rootCause = e;
        while (rootCause.getCause() != null) {
            rootCause = rootCause.getCause();
        }
        
        String detailMessage = rootCause.getMessage();
        logger.error("上传错误根因: {}", detailMessage);
        
        // 构造标准格式的错误响应
        Map<String, Object> response = new HashMap<>();
        response.put("success", false);
        response.put("message", "文件大小超出系统限制，最大允许300MB");
        response.put("error", "file_too_large");
        response.put("detail", detailMessage);
        
        // 返回413状态码，表示请求实体过大
        return ResponseEntity.status(HttpStatus.PAYLOAD_TOO_LARGE).body(response);
    }
    
    /**
     * 处理服务器通用异常
     * 捕获Servlet异常并记录详细信息
     *
     * @param e Servlet异常
     * @return 包含错误信息的响应实体
     */
    @ExceptionHandler(ServletException.class)
    public ResponseEntity<Map<String, Object>> handleServletException(ServletException e) {
        // 记录异常日志
        logger.error("Servlet异常", e);
        
        // 分析根因
        Throwable rootCause = e;
        while (rootCause.getCause() != null) {
            rootCause = rootCause.getCause();
        }
        
        String detailMessage = rootCause.getMessage();
        logger.error("Servlet错误根因: {}", detailMessage);
        
        Map<String, Object> response = new HashMap<>();
        response.put("success", false);
        response.put("message", "请求处理失败: " + e.getMessage());
        response.put("error", "servlet_error");
        response.put("detail", detailMessage);
        
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
    }
} 